<?php
!defined('ROOT') && define('ROOT', substr(__FILE__, 0, -15));

/**
 * 公共函数，均为静态方法
 *
 * 预定义全局变量PATH
 * com.*                    // 核心参数
 *
 * @author ananda
 */
class Com
{
    /**
     * 已经载入的模块记录
     * @var <array>
     */
    public static $module = array();

    /**
     * 全局变量存储属性
     * @var <array>
     */
    protected static $global = array();

    /**
     * 创建应用
     * @param <string> $app_class
     * @param <array> $config
     * @return app_class
     */
    public static function createApplication($app_class, $config)
    {
        // 配置初始化
        self::initConfig($config);

        // 环境初始化
        self::initEnv();

        self::glob('event')->trigger('com_init');

        // 创建应用对象
        $classname = "App_$app_class";
        self::glob('app', new $classname());

        return self::glob('app');
    }

    /**
     * 初始化配置
     * @param <array> $config
     */
    public static function initConfig($config)
    {
        // 设置框架目录
        self::glob('com.root', ROOT);
        self::glob('com.dir.conf',    'conf');
        self::glob('com.dir.library', 'library');
        self::glob('com.dir.module',  'module');

        // 设置全局配置参数
        foreach ($config as $key => $value) {
            self::glob('com.'.$key, $value);
        }

        // 设置主模块目录
        self::glob('com.dir.self', ROOT.'module'.DIRECTORY_SEPARATOR.self::glob('com.module'));
    }

    /**
     * 初始化环境
     */
    public static function initEnv()
    {
        // 开启调试模式判定
        if (self::glob('com.debug_mode')) {
            !defined('DEBUG') && define('DEBUG', 1);
            error_reporting(E_ALL);
        }

        // 设置自动载入
        spl_autoload_register(__CLASS__.'::autoLoad');
        set_include_path(CROOT.self::glob('com.dir.library').
                         PATH_SEPARATOR.get_include_path());

        // 创建DOCK
        Com::glob('com.dock', new Dock());

        //做一些初始化工作
        if (self::glob('com.import')) {
            foreach (self::glob('com.import') as $module) {
                require self::import($module);
            }
        }

        $e_conf = self::glob('com.exception');
        // 注册错误转违例函数
        $e_conf['error_handler'] && set_error_handler($e_conf['error_handler'], error_reporting(E_ALL));

        // 未捕获违例处理函数
        $e_conf['exception_handler'] && set_exception_handler($e_conf['exception_handler']);

        // 设置事件对象
        $event_conf = self::glob('com.event');
        $classname  = isset($event_conf['class']) ? $event_conf['class'] : 'Event';
        $event = new $classname;
        self::glob('event', $event);
        foreach ($event_conf['predefined'] as $name => $func_list) {
            foreach ($func_list as $func) {
                $event->attach($name, $func);
            }
        }

        require self::import(self::glob('com.module'));
    }

    /**
     * 自动载入类
     * @param <string> $classname
     */
    public static function autoLoad($classname)
    {
        $classname = str_replace('_', DIRECTORY_SEPARATOR, $classname);
        @require_once "$classname.php";
        return class_exists($classname,false) || interface_exists($classname,false);
    }

    /**
     * 导入模块
     * @param <string> $module
     * @return <string>
     */
    public static function import($module)
    {
        if (isset(self::$module[$module])) {
            return true;
        }

        $module_path = CROOT.self::glob('com.dir.module').
                       DIRECTORY_SEPARATOR.$module;

        set_include_path($module_path.DIRECTORY_SEPARATOR.
                         self::glob('com.dir.library').PATH_SEPARATOR.get_include_path());
        self::$module[$module] = 1;

        return $module_path.DIRECTORY_SEPARATOR.'init.php';
    }

    /**
     * 全局变量注册函数
     * @param <string> $path
     * @param <mixed> $value
     * @return <mixed>
     */
    public static function glob($path = null, $value = null)
    {
        // 判断是否返回一个Dock
        if (!$path) {
            return Com::glob('com.dock');
        }

        // 正常返回配置数据
        if ($value !== null) {
            self::$global[$path] = $value;
        } elseif (!isset(self::$global[$path])) {
            self::$global[$path] = null;
        }
        return self::$global[$path];
    }

    /**
     * 调试输出函数
     * @staticvar <integer> $counter
     * @param <mixed> $var
     * @param <string> $title
     */
    public static function dump($var, $title = null)
    {
        static $counter = 0;
        $counter++;

        !$title && $title = $counter;
        if (isset($_SERVER['REQUEST_URI'])) {
            echo "<p><strong>Dump #$title</strong></p>";
            echo '<pre>';
            var_dump($var);
            echo '</pre>';
        } else {
            echo "\n=== Dump #$title ===\n";
            var_dump($var);
            echo "\n";
        }
    }
}
?>